home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / pdselect / blizkick / free100buf.asm < prev    next >
Assembly Source File  |  2000-02-16  |  3KB  |  174 lines

  1. ; FILE: Source:Free100buf.ASM          REV: 17 --- Free std $100-buf
  2.  
  3.     include    "Devpac:Gen.gs"
  4.  
  5.  
  6. Main    move.l    (4).w,a6        ; Get execbase
  7.     sub.l    a1,a1            ; Find our task
  8.     jsr    -$126(a6)        ;FindTask
  9.     move.l    d0,a3
  10.  
  11.     tst.l    $AC(a3)            ; pr_CLI
  12.     bne.s    _main            ; Hey we're CLI!
  13.  
  14.     lea    $5C(a3),a0        ; pr_MsgPort
  15.     jsr    -$180(a6)        ;WaitPort
  16.     lea    $5C(a3),a0        ; pr_MsgPort
  17.     jsr    -$174(a6)        ;GetMsg
  18.     move.l    d0,-(sp)
  19.  
  20.     bsr.s    _main
  21.     move.l    d0,d2            ; Store return code
  22.  
  23.     move.l    4.w,a6
  24.     move.l    (sp)+,a1
  25.     jsr    -$84(a6)        ;Forbid
  26.     jsr    -$17A(a6)        ;ReplyMsg
  27.  
  28.     move.l    d2,d0            ; WOW! Return code is set.
  29.     rts
  30.  
  31.  
  32. _main    moveq    #RETURN_WARN,d7
  33.  
  34.     call    Forbid
  35.     move.l    ($100).w,a2
  36.  
  37.     move.l    a2,a1
  38.     bsr.b    .testmem
  39.     beq.b    .nomem
  40.  
  41.     move.l    a2,a1
  42.     add.l    (4,a2),a1
  43.     subq.l    #1,a1
  44.     bsr.b    .testmem
  45.     beq.b    .nomem
  46.  
  47.     cmp.l    #$DEADBEEF,(a2)
  48.     bne.b    .nomem
  49.     cmp.l    #$200000*4,(4,a2)
  50.     bhi.b    .nomem
  51.  
  52.     move.l    a2,a1
  53.     move.l    (4,a2),d0
  54.     bsr    FreeMemSafely
  55.  
  56.     tst.l    _ErrFlag
  57.     bne.b    .nomem
  58.  
  59.     clr.l    ($100).w
  60. ;;    clr.l    (a2)            DON'T -- Will corrupt MH_FREELIST -> $8100000C
  61. ;;    clr.l    (4,a2)            No need MH_FREELIST will kill it... :)
  62.  
  63.     moveq    #RETURN_OK,d7
  64.  
  65. .nomem    call    Permit
  66.     move.l    d7,d0
  67.     rts
  68.  
  69. .testmem    move.l    a1,-(sp)
  70.     call    TypeOfMem
  71.     move.l    (sp)+,a0
  72.     tst.l    d0
  73.     beq.b    .tmnomem
  74.  
  75.     bsr.b    MemoryInfo
  76.     move.l    d0,d1
  77.     addq.l    #1,d1
  78.     beq.b    .tmnomem
  79.     btst    #MEMB_LARGEST,d0    Allocated?
  80. .tmnomem    rts
  81.  
  82.  
  83.     CNOP    0,4
  84. ; Code taken from mon and modified a bit by me.
  85. ;  IN: a0=memaddr
  86. ; OUT: d0=-1 if not in memlist, d0=attributes+bit MEMB_LARGEST set if allocated
  87. MemoryInfo    movem.l    d1-d2/d5/a0-a1/a5-a6,-(sp)
  88.     move.l    a0,d5
  89.     move.l    (4).w,a6
  90.     call    Forbid
  91.     move.l    (MemList,a6),a5
  92. .loop    tst.l    (a5)
  93.     beq.b    .not_found
  94.     cmp.l    (MH_LOWER,a5),d5
  95.     bcs.b    .next
  96.     cmp.l    (MH_UPPER,a5),d5
  97.     bcc.b    .next
  98.     move.l    (MH_FIRST,a5),d2
  99. .scanfreemem    beq.b    .validmem
  100.     move.l    d2,a1
  101.     cmp.l    a1,d5
  102.     blo.b    .notthis
  103.     move.l    (4,a1),d0
  104.     lea    (a1,d0.l),a0
  105.     cmp.l    a0,d5
  106.     blo.b    .validmem
  107. .notthis    move.l    (a1),d2
  108.     bra.b    .scanfreemem
  109. .next    move.l    (a5),a5
  110.     bra.b    .loop
  111.  
  112. .not_found    sub.l    a5,a5
  113. .validmem
  114.     moveq    #-1,d0
  115.     move.l    a5,d1
  116.     beq.b    .not_valid_mem
  117.  
  118.     moveq    #0,d0
  119.     move.w    (MH_ATTRIBUTES,a5),d0
  120.     
  121.     tst.l    d2            d2=0 -> memory allocated
  122.     bne.b    .is_free
  123.     bset    #MEMB_LARGEST,d0
  124. .is_free
  125. .not_valid_mem    call    Permit
  126.     movem.l    (sp)+,d1-d2/d5/a0-a1/a5-a6
  127.     rts
  128.  
  129.  
  130.     CNOP    0,4
  131. _ErrFlag    dc.l    0
  132. FreeMemSafely    movem.l    d0/a1,-(sp)
  133.     clr.l    _ErrFlag
  134. ;;    sub.l    a1,a1
  135. ;;    call    FindTask
  136. ;;    move.l    d0,.ThisTask
  137.     move.l    a3,.ThisTask
  138.     lea    (.Alertp,pc),a0
  139.     move.l    a0,d0
  140.     move.w    #_LVOAlert,a0
  141.     move.l    a6,a1
  142.     call    Forbid
  143.     call    SetFunction
  144.     move.l    d0,.OldAlert
  145.     call    Permit
  146.     movem.l    (sp)+,d0/a1
  147.     call    FreeMem
  148.     move.l    (.OldAlert,pc),d0
  149.     move.w    #_LVOAlert,a0
  150.     move.l    a6,a1
  151.     call    Forbid
  152.     call    SetFunction
  153.     call    Permit
  154.     rts
  155.  
  156.     CNOP    0,4
  157. .OldAlert    dc.l    0
  158. .ThisTask    dc.l    0
  159. .Alertp    move.l    d0,-(sp)
  160.     move.l    (ThisTask,a6),d0
  161.     cmp.l    (.ThisTask,pc),d0
  162.     bne.b    .alert
  163.     st    _ErrFlag
  164.     move.l    (sp)+,d0
  165.     rts
  166.  
  167. .alert    move.l    (sp)+,d0
  168.     move.l    (.OldAlert,pc),-(sp)
  169.     rts
  170.  
  171.  
  172.     dc.b    '$VER: Free100buf 1.0 (21.5.97)',0
  173.     dc.b    '$COPYRIGHT: Copyright © 1997 Harry Sintonen',0
  174.